home *** CD-ROM | disk | FTP | other *** search
/ The PC-SIG Library 10 / The PC-Sig Library - Shareware for the IBM PC and Compatibles (PC-SIG)(Tenth Edition Disks 1-2804)(1991).iso / PC_SIGCD / 22 / 2 / DISK2220.ZIP / SCREDIT2.EXE / CHGFIELD.C < prev    next >
C/C++ Source or Header  |  1991-01-05  |  7KB  |  209 lines

  1. /*
  2.  ChgField.C This small program has been provided to demonstrate how to
  3.  code routines that will: 
  4.      1. Store the current screen display when a Turbo ScrEdit program
  5.         is executed and re-store the screen when the program ends.
  6.      2. Use the mouse to move the current data entry cursor from the
  7.         current field to the field that the left mouse button has
  8.         been "clicked" on.
  9.      3. Use the up and down arrow keys to move the current data entry
  10.         field up and down in columns of fields.
  11.  
  12.  Step 1
  13.     To use this file for screen you create, do the following..
  14.      1 - Change "ScrDemo.006"   to the name of your screen buffer.
  15.      2 - Change "ScrDemo.Scr"   to the name of your screen file.
  16.      3 - Change "ChgField_Demo" to the name of your screen.
  17.  
  18.  Step 2
  19.  
  20.     Turbo C 2.0
  21.          Create a project file "CHGFIELD.PRJ" that contains the following
  22.          lines:
  23.  
  24.          ChgField.C   
  25.          ScrEditM.Lib
  26.  
  27.     Turbo C ++
  28.          Open a project file with the following lines (The names
  29.          listed below will also be changed as listed above.)
  30.  
  31.      Set (P)ROJECT/(O)PEN PROJECT/(L)OAD PROJECT FILE to "CHGFIELD.prj"
  32.      press (INSert) and type "CHGFIELD.C"
  33.      press (INSert) and type "ScrEditM.Lib"
  34.  
  35.  
  36.  Step 3
  37.     Next be sure that you..
  38.     (Turbo C 2.0) Set COMPILER/(P)RIMARY C FILE to CHGFIELD.C
  39.  
  40.     Set OPTIONS/DIRECTORIES/(I)NCLUDE DIRECTORIES to include the
  41.             directory where you have stored "ScrEdit.H".
  42.  
  43.     Set OPTIONS/DIRECTORIES/(L)IBRARY DIRECTORIES to include the
  44.         directory where you have stored "ScrEditM.Lib".
  45.     
  46.     Set OPTIONS/COMPILER/(C)ODE GENERATION TO (M)edium 
  47.  
  48.  Step 4
  49.     Compile and run the program.
  50.  
  51.  After you performed the steps listed above this program will
  52.  compile and run if the screen file and screen buffers are in the
  53.  current directory.
  54.  ********************************************************************/
  55. #include <stdlib.h>
  56. #include <stdio.h>
  57. #include <dos.h>
  58. #include <string.h>
  59. #include <mem.h>
  60. #include <conio.h>
  61. #include "ScrEdit.H"
  62. #include "ScrDemo.006"
  63. unsigned char MaxFields;
  64.  
  65. /* 
  66.  define variables to store the original screen 
  67. */
  68. unsigned char OriginalX, OriginalY, *OriginalScreen;
  69.  
  70. /*
  71.  This routine converts mouse cursor location into screen field 
  72.  numbers.
  73. */
  74. int MouseToField()
  75. {
  76. int loop;
  77. loop=0;   
  78. do
  79.  {
  80.  if ((s_field->C.s_row[loop]==s_msrow) &&
  81.      (!((s_mscol<s_field->C.s_col[loop])||
  82.       (s_mscol>(s_field->C.s_col[loop]+s_field->C.s_len[loop])))))
  83.     return loop;
  84.  loop++;
  85.  }
  86. while (loop <= MaxFields);
  87. return s_point;
  88. }
  89.  
  90. /*
  91.  This routine searches for the closest field on the screen that is
  92.  above or below the current field.
  93.  Dir:
  94.    If Dir = 1 Then the search is above then wrap around to bottom.
  95.    If Dir = 0 Then the search is below then wrap around to top.
  96.  *CurField:
  97.    Field number of current field when arrow key was pressed.
  98.  Op:
  99.    If Op =  1 Then move cursor to the first field located on a different
  100.                    row of the screen that begins in a column equal to 
  101.                    or greater than the current fields column.
  102.    If Op =  0 Then move the cursor to the next field located on a different
  103.                    row of the screen that begins in the same column as the 
  104.                    current screen field.
  105.    If Op = -1 Then move the cursor to the next field located on a different
  106.                    row of the screen that begins in a colunn less than or
  107.                    equal to the current fields column.
  108. */
  109. int ChgField (unsigned char Dir, int *CurField, int Op)
  110. {
  111. int loop;
  112. loop=*CurField;   
  113. do
  114.  {
  115.  if (Dir)
  116.      {
  117.      if (++loop > MaxFields) loop=0; /* Search UP on screen */
  118.      }
  119.  else 
  120.      {
  121.      if (--loop < 0) loop=MaxFields; /* Search DOWN on screen*/
  122.      }
  123.  
  124.  if ((s_field->C.s_type[loop] < 10) /* Select data entry field type 0-9     */
  125.   && (s_field->C.s_row[loop]!=      /* that are not on same row as original */
  126.       s_field->C.s_row[*CurField])) /* field                                */
  127.     {
  128.     switch (Op){
  129.        case  1 : /* locate prev field in column = or < current field    */
  130.                  /* Similar results to SHIFT TAB only skips all previous*/
  131.                  /* fields on same line as current field                */
  132.             {if (!(s_field->C.s_col[loop] < s_field->C.s_col[*CurField]))
  133.                 {
  134.                 return loop;
  135.                 }
  136.             break;
  137.             }
  138.         case 0 : /* locate prev field in same column only */
  139.             {if (s_field->C.s_col[loop] == s_field->C.s_col[*CurField])
  140.                 {
  141.                 return loop;
  142.                 }
  143.              break;
  144.             }
  145.         case -1: /* locate next field in column = or > current field   */
  146.                  /* Similar results to TAB only skips all remaining    */
  147.                  /* field on the same line as the current field.       */
  148.             {if (!(s_field->C.s_col[loop] > s_field->C.s_col[*CurField]))
  149.                 {
  150.                 return loop;
  151.                 }
  152.             break;
  153.             }
  154.         }
  155.      }
  156.  }
  157.  while (loop != *CurField); /* if current line is reached in the loop       */
  158.                             /* there are no qualifiying fields on the       */
  159.                             /* screen so return subscript of original field */
  160. return *CurField;
  161. }
  162.  
  163. void main()
  164. {
  165. delay(0); /* initialize delay function */
  166.  
  167. /* Grab original screen */
  168. OriginalX=wherex();
  169. OriginalY=wherey();
  170. OriginalScreen=(unsigned char *)malloc(4000);
  171. gettext(1,1,80,25,OriginalScreen);
  172. /***********************/
  173.  
  174. s_init();                 
  175. s_openscreenfile("ScrDemo.Scr");
  176. initialize_ChgField_Demo_buf();
  177. s_loadscreen("ChgField_Demo");
  178. /*
  179.  * Pick up the maximum number of fields on the screen.. (This value 
  180.  * is only available imeadiatly after the screen is loaded)
  181.  */
  182. MaxFields = s_indx->A.s_count[s_num]-1;
  183.  
  184. s_clearscreen(1);
  185. s_cursor = S_NORMAL;
  186.  
  187. s_activatemouse();
  188. s_setmouseevent("01000000");
  189. s_showmouse();
  190.  
  191. do{
  192.   s_readscreen();
  193.   if (s_ms->mouseevent)
  194.      {
  195.      s_analizemouse();
  196.      s_point = MouseToField();
  197.      s_resetmouseflags();
  198.      }
  199.   if  (s_up)   s_point = ChgField(0,&s_point,0);
  200.   if  (s_down) s_point = ChgField(1,&s_point,0);
  201.   }
  202. while (!s_esc);
  203. s_closescreenfile();
  204. s_disablemouse();
  205. /* restore original screen */
  206. puttext(1,1,80,25,OriginalScreen);
  207. gotoxy(OriginalX,OriginalY);
  208. /***************************/
  209. }